Skip to main content

Linux Basic

Table of Contents

linux 命令

帮助信息

 $ man <command>                                 # man (manual) 帮助手册, 查看命令的帮助手册
$ man -f <command> # 显示命令的简短描述
$ man -f date
> date (1) - print or set the system date and time

$ whatis <command> # 显示命令的简短描述, 等同于 man -f <command>
$ whatis date
> date (1) - print or set the system date and time

$ <command> -h/--help # 命令使用 -h/--help 参数
$ date -h
$ date --help
> Usage: date [OPTION]... [+FORMAT]
> or: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
> Display the current time in the given FORMAT, or set the system date.

文件与路径

 $ pwd                                           # 查看当前目录
> /root/Desktop

$ ls # 查看当前目录下的文件及文件夹
> source.sh target.tar.gz

$ cd <path> # 切换到 path 目录(无返回值), path 不存在则报错
~/Desktop/Zip$ # 命令行 $ 左边即为当前目录
 $ cp <source> <destination>                     # 文件复制
$ mv <source> <destination> # 文件移动或重命名
$ rm <file> # 删除文件
$ mkdir <path> # 创建文件夹
$ touch <file> # 创建文件
$ cat <file> # 查看文件内容

$ touch learn.log # 创建文件 learn.log
$ mkdir seeds # 创建文件夹 seeds
$ cp learn.log seeds/ # learn.log 复制到 seeds 文件夹下
$ rm learn.log # 删除当前目录下的 learn.log
$ mv seeds/learn.log study.log # 将 seeds 下的 learn.log 移动到当前目录并重命名
$ rm -r seeds # 删除 seeds 文件夹及文件夹下的所有文件

> 'learn.log' -> create
> 'seed/' -> create
> 'learn.log' -> 'seed/learn.log'
> 'learn.log' -> delete
> 'seeds/learn.log' -> 'study.log'
> 'seed/' -> delete

查看执行过命令

 $ history                                       # 查看执行的命令历史
> 1 ls
> 2 date

$ !! # 执行上一条命令
$ !<command key> + enter # 通过命令关键字和 enter 执行上一个包含关键字的命令

$ control + r + <command key> # 快捷键进入历史列表, 通过关键字查找, enter 执行命令
> (reverse-i-search)`echo $': echo $PWD # `echo $' 是输入关键字, : 后为匹配的命令, 方向键选择命令但不执行

全局变量

全局变量是在整个操作系统中都可用的变量,其值可以在任何地方被访问和修改

 $ echo $HOME                                    # 当前用户名
> root

$ echo $PATH # 执行命令时所搜寻的路径列表, 以 : 分隔(环境变量设置路径)
> /usr/local/sbin:/usr/local/bin:/usr/bin

$ echo $SHELL # 当前使用的 shell
> /bin/zsh

$ echo $PWD # 当前绝对路径
> /root/Desktop/

$ echo $RANDOM # 生成随机数字
> 2166

修改 shell 启动文件(每次打开命令行均会执行)以永久设置环境变量, 使用 export 添加环境变量

export <variable name>=<value>                   # 使用 export 临时修改环境变量, 执行的命令窗口关闭即失效
export PATH=$PATH:/home/john # 将 /home/john 临时加入环境目录
export LEARN=TRUE # 自定义新的环境变量, 脚本间可以通过自定义环境变量通信
export PATH=$PATH:/home/john # 将命令写入 shell 启动文件(每次启动 shell 均会执行文件上命令)
source ~/.bashrc # 重新加载 shell 启动文件(~/.bashrc, ~/.zshrc )

bash 执行脚本: 新建子 shell 执行脚本, 脚本中的 export 的变量只在子 shell 生效, 脚本结束变量失效 source 执行脚本: 脚本中的 export 变量加载入当前终端, 脚本结束仍然生效, 当前终端关闭后失效

 $ echo 'export linux="bash"' > bash.sh          # 生成脚本 bash.sh
$ echo 'export linux="source"' > source.sh # 生成脚本 source.sh

$ bash bash.sh && echo "linux: $linux" # 使用 bash 添加 linux 变量
> linux: # 脚本结束, 变量失效

$ source source.sh && echo "linux: $linux" # 使用 source 执行脚本
> linux: source shell # 脚本结束, 变量仍然生效

系统相关

 $ shutdown -h now                               # 关机
$ shutdown -r now # 重启

$ date # 系统时间
> Sat Feb 25 20:34:10 CST 2023

$ unmae -a # 查看系统内核信息
> linux john 5.15.79.1-microsoft-standard-WSL2 #1 SMP Wed Nov 23 01:01:46 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

$ ps -ef # 查看当前正在运行的所有进程
> UID PID PPID C STIME TTY TIME CMD
> root 1399 71 0 19:08 pts/4 00:00:00 /bin/zsh -i
> root 9481 490 0 20:24 pts/4 00:00:00 bash -x a.sh

$ kill <pid> # 根据 pid 关掉指定进程
$ kill 9481
> [1] + 9481 terminated bash -x a.sh

用户

启用 root 用户

 $ sudo passwd root
> Enter new UNIX password: # 设置 root 用户密码(输入时密码不可见)
> Retype new UNIX password: # 重复输入 root 密码
> passwd: password updated successfully # 设置成功

john@master:~/Desktop$ su root # 切换 root 用户 (用户名@hostname:当前路径)
root@master:~/Desktop# exit # 退出 root, 普通用户 $ 开头, root 用户 # 开头

$ su <user> # 切换用户

创建用户

 $ useradd -m <username>                         # 创建用户, 并在 /home 生成用户目录
$ useradd -l <oldName> <newName> # 更换用户名称

$ passwd <username> # 用户添加密码
> New password: # 输入密码, 密码不显示
> Retype new password: # 重复输入密码, 密码不显示

$ userdel -r <username> # 删除用户
> no crontab for john

sudo 免密码

 $ sudo vi /etc/sudoers                          # 编辑配置文件

> %sudo ALL=(ALL:ALL) ALL # 找到这一栏, 建议注释掉复制一行修改
> %sudo ALL=(ALL:ALL) NOPASSWD:ALL # 修改后, 强制保存退出
> <username> ALL=(ALL) NOPASSWD:ALL

注: 该文件必须强制写入, 不能修改文件权限, 否则报错

通配符号

任意单个字符

 $ touch ab a bc abc                             # 生成 ab a ba abc 4 个文件

$ ls ?b # ? 可以指代任意单个字符
> ab

$ ls b?
> bc

* 任意多个字符

 $ touch ab a bc abc                             # 生成 ab a ba abc 4 个文件

$ ls * # * 可以指代任意多个字符
> a ab abc bc

$ ls a*
> a ab abc

** 任意多级目录

 $ cat /etc/**/word                               # /etc/ 文件夹下所有 word 文件

$ ls learn/**/*.md # 显示 learn 目录下所有 markdown 文件
> a.md b.md c.md

[] 匹配范围

 $ touch aa ab ac aab                            # 生成 ab a ba abc 4 个文件

$ ls a[ab] # 匹配 [] 内任意一个字符
> aa ab

特殊符号

输出重定向

输出重定向输出重定向追加写入输入重定向读取标准输入直至分界符号
>>><<<
 $ <command> > <file>                            # 将命令返回值覆盖写入文件(原文件清空后写入)
$ date > file.log # 将 date 命令返回值写入 file.log 文件, 命令行不显示结果
> Sat Feb 25 20:39:56 CST 2023

$ <command> >> <file> # 将输出追加写入文件(原文件内容保留)
$ date >> file.log # 将 date 命令返回值追加写入 file.log 内容结尾, 命令行不显示结果
> Sat Feb 25 20:39:56 CST 2023
> Sat Feb 25 20:40:51 CST 2023

$ <command> < <file> # 将文件内容重定向为标准输入
$ cat < file.log # 读取 file.log 并打印
> Sat Feb 25 20:39:56 CST 2023
> Sat Feb 25 20:40:51 CST 2023

$ touch $(< fileName.log) # 根据文件内的文件列表生成文件

$ cat << EOF # 实现多行输入, 分界符号 EOF 可自定义
> line
> line
> EOF

&1: 标准输出, 命令行输出, 能直接重定向至文件
&2: 标准错误, 命令执行错误输出, 需要将错误重定向至标准输出再指向文件
/dev/null: 空, 指代垃圾桶或回收站

 $ main                                          # 错误命令,显示错误输出
> Command 'main' not found

$ data 2>/dev/null # 错误命令, 错误输出重定向至回收站, 不显示错误
$ date 2>/dev/null # 正确命令, 标准输出重定向至回收站, 不显示返回值

$ data 2 > date.log # 命令行显示错误, 文件不显示, 错误输出无法直接重定向文件
$ data > date.log 2>&1 # 命令行不显示错误, 文件内显示, 错误输出重定向至文件

单词缩写

缩写全称翻译
aall全部
bbackup备份
ccount计数
ddirectory文件
fforce强制
hhelp帮助
iinteractive交互的
llong长格式的
r / Rrecursive递归
s / Ssort/size排序/大小
ttime时间
uuser用户
vversion / verbose版本/详细的

符号

符号含义
>输出重定向, 覆盖
>>输出重定向, 追加
&程序放入后台执行
#注释
&&且, 左边成功才执行右边

正则表达式

符号模式
^锚定行首
$锚定行尾
()捆绑成一个整体
.任意一个字符
?前面字符或模式 0 或 1 次
{m}前面字符或模式 m 次
{m, n}前面字符或模式次数在 m n 之间
+前面字符或模式 1 次或多次
*前面字符或模式任意次
[]括号范围内均可
[^]括号范围之外均可